package com.itheima.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.bean.User;
import com.itheima.common.R;
import com.itheima.exception.CustomException;
import com.itheima.service.UserService;
import com.itheima.utils.SMSUtils;
import com.itheima.utils.ValidateCodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.Map;

@RequestMapping("/user")
@RestController
public class UserController {

    @Autowired
    private UserService userService;

    //获取验证码
    @PostMapping("/sendMsg")
    public R<String> sendMsg(@RequestBody User user, HttpSession session){
        //1.获取手机号
        String phone = user.getPhone();

        //2.生成验证码
        String validateCode = ValidateCodeUtils.generateValidateCode(4).toString();
        System.out.println("validateCode = " + validateCode);

        //3.将验证码保存到session中，key使用手机号 value存验证码
        session.setAttribute(phone,validateCode);

        //4.调用工具类发送短信验证码  验证码的有效期：现在使用session存储 和session有效期一致  这不合理 但是目前也就这样了  后期我们会使用redis进行优化
        //SMSUtils.sendMessage("瑞吉外卖","瑞吉外卖",phone,validateCode);

        //5.响应数据
        //return R.success("短信验证码发送成功！");
        return R.success(validateCode);
    }

    //用户登录
    @PostMapping("/login")
    public R<User> login(@RequestBody Map<String,Object> map,HttpSession session){
        //1.获取手机号和用户输入的验证码
        String phone = map.get("phone").toString();
        String code = map.get("code").toString();

        //2.根据手机号获取session中存储的验证码  {"13112345678":"1234"}
        Object validateCode = session.getAttribute(phone);

        //3.1：如果session中存储的验证码为null  说明验证码已经失效
        if(validateCode==null){
            throw new CustomException("验证码已过期，请重新发送！");
        }

        //3.2：比较session中的验证码和用户输入的验证码是否一致
        //4.1：不一致：说明用户输入的验证码有误
        if(!validateCode.toString().equalsIgnoreCase(code)){
            return R.error("验证码输入有误！");
        }

        //5.1：一致：判断当前手机号在数据库中是否存在  存在：不用管
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(User::getPhone,phone);
        User one = userService.getOne(wrapper);

        //5.2：不存在：保存到数据库user表中
        if(one == null ){
            //a:创建用户对象
            one = new User();
            //b：设置默认用户名和手机号
            one.setName("u_"+phone);
            one.setPhone(phone);
            //c：存入到user表中
            userService.save(one);
        }

        //4.2：一致：登录成功，将用户id存入到session中   响应登录成功的用户给前端
        session.setAttribute("user",one.getId());
        return R.success(one);
    }


    //退出登录
    @PostMapping("/loginout")
    public R<String> logout(HttpSession session){
        //1.清空session中数据
        session.invalidate();  //直接销毁当前用户管理的session对象  因此保存在session中的当前用户数据也被销毁了

        //2.返回退出成功
        return R.success("退出成功！");
    }

}
